﻿#include "widget.h"

Widget::Widget(QWidget *parent)
    : QOpenGLWidget(parent), VBO(QOpenGLBuffer::VertexBuffer)
{
    QSurfaceFormat format;
    format.setAlphaBufferSize(24);  //设置alpha缓冲大小
    format.setVersion(3, 3);        //设置版本号
    format.setSamples(10);          //设置重采样次数，用于反走样
    //...
    setFormat(format);

    vertices =
    {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f,  0.5f, 0.0f
    };
}

Widget::~Widget()
{}

void Widget::initializeGL()
{
    initializeOpenGLFunctions();        //初始化opengl函数
    if(!shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/triangle.vert"))     //添加并编译顶点着色器
    {
        qDebug() << "ERROR:" << shaderProgram.log(); //如果编译出错,打印报错信息
    }
    if(!shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/triangle.frag"))   //添加并编译片段着色器
    {
        qDebug() << "ERROR:" << shaderProgram.log(); //如果编译出错,打印报错信息
    }
    if(!shaderProgram.link())                       //链接着色器
    {
        qDebug() << "ERROR:" << shaderProgram.log(); //如果链接出错,打印报错信息
    }

//    VAO.create();       //生成VAO对象
//    VAO.bind();         //绑定VAO，之后所以的顶点缓冲对象的操作都会存储到VAO中

    QOpenGLVertexArrayObject::Binder{&VAO};   //绑定VAO（不存在时创建），离开作用域自动解绑

    VBO.create();       //生成VBO对象
    VBO.bind();         //将VBO绑定到当前的顶点缓冲对象（QOpenGLBuffer::VertexBuffer）中
    //将顶点数据分配到VBO中，第一个参数为数据指针，第二个参数为数据的字节长度
    VBO.allocate(vertices.data(), sizeof(float)*vertices.size());

    shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3, sizeof(GLfloat) * 3);
    shaderProgram.enableAttributeArray(0);

//    VAO.release();      //解绑VAO，安全使用
}

void Widget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);             //定义视口区域
}

void Widget::paintGL()
{
    glClearColor(0.1f, 0.5f, 0.7f, 1.0f); //设置清屏颜色
    glClear(GL_COLOR_BUFFER_BIT);       //清除颜色缓存
    shaderProgram.bind();                     //使用shaderProgram着色程序
//    glDrawArrays(GL_TRIANGLES, 0, 3);   //使用以0开始，长度为3的顶点数据来绘制三角形
    {
        QOpenGLVertexArrayObject::Binder{&VAO};
        glDrawArrays(GL_TRIANGLES, 0, 3);   //使用以0开始，长度为3的顶点数据来绘制三角形
    }
}
